查看原文
其他

跨域,不止CORS

ConardLi code秘密花园 2022-05-03

我们通常提到跨域问题的时候,相信大家首先会想到的是 CORS(跨源资源共享),其实 CORS 只是众多跨域访问场景中安全策略的一种,类似的策略还有:

  • COEP: Cross Origin Embedder Policy:跨源嵌入程序策略
  • COOP: Cross Origin Opener Policy:跨源开放者政策
  • CORP: Cross Origin Resource Policy:跨源资源策略
  • CORB: Cross Origin Read Blocking:跨源读取阻止

COEP、COOP 这两个新策略我已经在前面的文章中介绍过了,感兴趣的可以看新的跨域策略:使用COOP、COEP为浏览器创建更安全的环境

今天,我来给大家介绍一下 CORB: Cross Origin Read Blocking (跨源读取阻止)

站点隔离

互联网是一个非常复杂多样的环境,我们可以在上面做各种事情,有的时候我们在上面存钱、有的时候在上面看视频,但是你肯定不希望看视频的网站知道你存了多少钱,所以在浏览器中不同来源的站点不能互相访问,我们熟悉的另一个名称是:同源策略。

但是很多恶意网站会通过各种巧妙的手段绕过这个限制,站点隔离是 Chrome 中的一项安全功能,它提供了额外的防护措施,可以降低此类攻击成功的可能性。

它可以确保始终将来自不同网站的页面置于不同的流程中,每个流程都在沙箱中运行,以限制流程的执行范围。它还阻止了从其他站点接收某些类型的敏感数据的过程。

跨域读取阻止

即使所有不同源的页面都处于自己单独的进程中,页面仍然可以合法的请求一些跨站的资源,例如图片和 JavaScript 脚本,有些恶意网页可能通过 <img> 元素来加载包含敏感数据的 JSON 文件:

<img src="https://your-bank.example/balance.json">
<!-- Note: the attacker refused to add an `alt` attribute, for extra evil points. -->

如果没有 站点隔离 ,则 JSON 文件的内容会保存到渲染器进程的内存中,此时,渲染器会注意到它不是有效的图像格式,并且不会渲染图像。但是,攻击者随后可以利用 Spectre 之类的漏洞来潜在地读取该内存块。

Spectre 漏洞我也在这片文章介绍过了 新的跨域策略:使用COOP、COEP为浏览器创建更安全的环境

攻击者可以使用 <img> 而不是使用 <script> 来将敏感数据提交到内存:

<script src="https://your-bank.example/balance.json"></script>

跨域读取阻止(CORB)是一项安全功能,它可以根据其 MIME 类型防止 balance 内容进入渲染器进程内存中。

我们看一下 CORB 的工作方式。网站可以从服务器请求两种类型的资源:

  • 数据资源,例如 HTML,XML 或 JSON 文档
  • 媒体资源,例如图像,JavaScript,CSS或字体

使用 CORS 头,如 Access-Control-Allow-Origin: * ,网站能够从自己的来源或其他来源接收数据资源。另一方面,媒体资源可以来自任何来源,即使没有允许的 CORS 头。'

如果发生以下情况,CORB 会阻止渲染器进程接收跨域数据资源(即 HTML,XML或JSON):

  • 资源具有 X-Content-Type-Options: nosniff Header
  • CORS 并未明确允许访问资源

如果跨域数据资源未设置 X-Content-Type-Options: nosniff Header,则 CORB 尝试嗅探响应主体以确定它是 HTML,XML 还是 JSON。这是必需要做的的,因为某些 Web 服务器配置不正确,例如将图像配置为 text/html

使用 CORB 策略

为了使我们的网站更加安全,建议所有网站都开启 CORB,只需要下面的操作:

  • 配置正确的 Content-Type 。(例如,HTML 资源设置 text/html)。
  • 开启 X-Content-Type-Options: nosniff 来防止站点进行自动 MIME 嗅探


读者讨论又因为不可抗力被暂停了,文章交流可以先加我好友或在公众号后台留言,如果文章帮到了你,欢迎【在看、点赞】支持


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存